/*
 * @Author: Clark
 * @Email: haixuanwoTxh@gmail.com
 * @Date: 2021-12-10 12:08:07
 * @LastEditors: Clark
 * @LastEditTime: 2021-12-10 16:07:32
 * @Description: file content
 */

#ifndef TCP_SOCKET_H
#define TCP_SOCKET_H

#include "protocol_engine.h"

#define MAX_EVENTS 100
#define CLIENT_SIZE 100
#define NEVER_TIMEOUT -1

/**
 * @brief epoll实现tcp server
 *  socket创建、管理、数据收发
 */
class TcpServer
{
public:
    TcpServer(unsigned short port);

    /**
     * @brief 初始化socket服务
     *        实现创建socket、bind、listen、accept，并收发数据
     * @return true 成功
     * @return false 失败
     */
    bool init();

    /**
     * @brief 开始服务
     *      等待客户端的连接，接收已连接客户端的数据
     * @return true 成功
     * @return false 失败
     */
    bool start();

    ~TcpServer();

private:
    /**
     * @brief accept连接的客户端
     * @return true 成功
     * @return false 失败
     */
    bool deal_accept();

    /**
     * @brief 处理收到的客户端数据
     * @param clientFd 与客户端对应的socket fd
     * @return true 成功
     * @return false 失败
     */
    bool deal_receive_data(int clientFd);

    /**
     * @brief 断开客户端的连接
     * @param clientFd 与客户端对应的socket fd
     * @return true 成功
     * @return false 失败
     */
    bool disconnet_client(int clientFd);

    /**
     * @brief 设置服务端为非阻塞
     * @return true 成功
     */
    bool setNonblock();

private:
    int serverFd;
    unsigned short port;
    int epollFd;
    ProtocolEngine *protocolEngine; // 与客户端交互协议引擎
};

#endif
